Ch3. 네이티브
네이티브란?
자주 사용하는 내장 생성자들:
String(),Number(),Boolean()Array(),Object(),Function()RegExp(),Date(),Error(),Symbol()
네이티브 = ECMAScript 명세에 정의된 내장 함수
window, document 같은 호스트 객체는 포함되지 않음
3.1 내부 [[Class]]
typeof가"object"인 값은[[Class]]내부 프로퍼티를 가짐Object.prototype.toString.call(obj)으로 확인 가능null,undefined는 특별히 다르게 처리됨
3.2 래퍼 박싱하기
var str = "abc";
console.log(str.length); // OK
- 원시값이지만 자동으로
String객체로 박싱됨 - 명시적 박싱:
new String("abc")→ 비추천 - Boolean 박싱 주의:
var isSuccess = new Boolean(false);
if (!isSuccess) console.log("Error!"); // 출력되지 않음
- Object로 래핑하는 방법:
var c = Object("abc");
3.3 언박싱
var a = new String("abc");
a.valueOf(); // "abc"
- 연산 중 자동 언박싱됨
"abc" + "def"→ 원시값으로 계산
3.4 네이티브, 나는 생성자다
리터럴 vs 생성자
var a = new Array(1, 2, 3);
var b = [1, 2, 3]; // 더 나은 방식
Sparse Array
var a = new Array(3); // [empty x 3]
→ 되도록 사용하지 말자
var a = Array.apply(null, { length: 3 }); // [undefined, undefined, undefined]
Object, Function, RegExp
var o = {};
var f = function(a) { return a * 2; };
var r = /abc/g;
- Function 생성자는 eval처럼 동작 → 비추천
- 정규표현식은 리터럴 사용 권장
Date, Error
new Date().getTime();
Date.now();
throw new Error("message");
Symbol
const sym = Symbol("my symbol");
const obj = { [sym]: "foo" };
Object.getOwnPropertySymbols(obj); // [Symbol(my symbol)]
- new Symbol() 은 에러
Symbol.iterator,Symbol.toPrimitive등 내장 Symbol 존재
3.5 네이티브 프로토타입
- 각 생성자는
.prototype객체를 가짐 String.prototype,Array.prototype,Function.prototype등- 프로토타입은 디폴트 값도 제공
function Foo() {}
Foo.prototype.name = "default";
- 직접 값을 세팅하는 것보다 프로토타입 활용이 메모리 측면에서 이점
정리
- 자바스크립트는 원시값을 감싸는 네이티브 객체 래퍼를 제공
- 생성자 사용보다는 리터럴을 사용하는 것이 더 안전
new없이 호출 가능한 생성자도 있음 (Symbol,Date,Error등 제외)- 프로토타입은 객체 간 공유 구조를 만들고 최적화를 돕는다
네이티브 프로토타입을 직접 수정하는 건 위험할 수 있으니 지양하자.